<?php
class Cli_clientes extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'Cli_cliente');

    	$this->title = 'Cliente :: Clientes';
		$this->CARPETA_VISTAS = 'clientes/';
		$this->nombre_entidad = 'Cliente';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'cliente_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'cliente_edit_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'cliente_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$objEntidad = $this->getObjeto($idEntidad);

		$objEntidad->razon_social = $this->input->post('txt_razon_social'); 
		$objEntidad->numero_doc = $this->input->post('txt_numero_doc');
		$objEntidad->telefono = $this->input->post('txt_telefono');
		$objEntidad->telefono2 = $this->input->post('txt_telefono2');
		$objEntidad->email = $this->input->post('txt_email');
		$objEntidad->observaciones = $this->input->post('txt_observaciones');
		$objEntidad->afip_tiporesponsable_id = $this->input->post('sel_responsable');
		$objEntidad->afip_tipodoc_id = $this->input->post('sel_documento');

		$de_baja = $this->input->post('chk_baja');
		if($objEntidad->baja != $de_baja){
			$objEntidad->baja = $de_baja ? TRUE : FALSE;
			if($de_baja) { 
				$fecha_actual = date($this->formatoFechaGuardar);
				$objEntidad->fecha_baja = $fecha_actual;
			}
		}

		# Objetos relacionados
		$objetosRel = array();

		$this->load->library('util_ubicacion');
		$id_ubicacion = is_numeric($this->input->post('txt_ubicacion')) ? $this->input->post('txt_ubicacion') : NULL;
		$objUbicacion = $this->util_ubicacion->cargarUbicacion($id_ubicacion, 
															   $this->input->post('f_txt_localidad_id'),
															   $this->input->post('f_txt_calle_id'),
															   $this->input->post('txt_altura'),
															   $this->input->post('txt_piso'),
															   $this->input->post('txt_depto'));	

		$datos['objEntidad'] = $objEntidad;
		$datos['objRelacionados'] = array($objUbicacion);

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		$obj_doc = new Afip_documento();
		$obj_doc->order_by('descripcion', 'asc');
		$dataView['listado_documentos'] = $obj_doc->get_iterated();

		$obj_resp = new Afip_responsable();
		$obj_resp->order_by('descripcion', 'asc');
		$dataView['listado_responsables'] = $obj_resp->get_iterated();

		return $dataView;
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$razon_social = trim($this->input->post('f_txt_razon_social'));
		if(!empty($razon_social)) { 
			$objEntidad->like('razon_social', $razon_social); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Razón social => ' . $razon_social;
		}

		$numero_doc = is_numeric($this->input->post('f_txt_numero_doc')) ? $this->input->post('f_txt_numero_doc') : 0;
		if($numero_doc != 0) {
			$objEntidad->where('numero_doc =', $numero_doc); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Numero de documento =>' . $numero_doc;
		}

		$tipo_doc = trim($this->input->post('f_sel_documento'));
		if(!empty($tipo_doc)) {
			$objEntidad->where('afip_tipodoc_id >=', $tipo_doc); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Tipo de documento =>' . $tipo_doc;
		}

		$tipo_responsable = trim($this->input->post('f_sel_responsable'));
		if(!empty($tipo_responsable)) {
			$objEntidad->where('afip_tiporesponsable_id >=', $tipo_responsable); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Tipo Responsable =>' . $tipo_responsable;
		}

		
		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* Carga todos los registros de un modelo o entidad (de acuerdo a los filtros o los últimos agregados) */
	public function ver_todos($dataView = array())
	{
			$dataView['metodo_cambio_estado'] = 'cambiar_estado';
			parent::ver_todos($dataView);
	}

	public function cambiar_estado($id_elemento)
	{
		$dataView['title'] = 'Cambiar estado de ' . $this->nombre_entidad;

		$obj_cliente = $this->getObjeto($id_elemento);
		 
		if(!$obj_cliente->baja) {
			$obj_cliente->baja = TRUE;
			$obj_cliente->fecha_baja = date($this->formatoFechaGuardar);
		}
		else $obj_cliente->baja = FALSE;

		// Se manejan transacciones para interactuar con la BD
		$obj_cliente->trans_begin();
		$obj_cliente->save();
		if ($obj_cliente->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $obj_cliente->trans_rollback(); // Si la transacción falló, hago un rollback
		}
		else
		{
		    $obj_cliente->trans_commit(); // Transacción exitosa, realizo el commit
		}

		$dataView['error'] = $obj_cliente->error->string; // Almaceno todos los errores que hubieran podido ocurrir					
				

		$this->ver_todos($dataView);
	}

	public function guardar()
	{
		/* Necesito asegurarme que la ubicación que se relacionará al cliente esté guardada */
		$datos = $this->getObjetoDesdeForm();
		$objRelacionados = $datos['objRelacionados'];
		$objUbicacion = $objRelacionados[0];
		
		$this->load->library('util_ubicacion');
		$resultado = $this->util_ubicacion->guardar($objUbicacion);
		$objRelacionados[0] = $resultado['objUbicacion'];
		$datos['objRelacionados'][0] = 
		
		$dataView = parent::guardarEntidad($datos);
		if(!empty($dataView['error'])) {
			// Falló el intento de guardar
			parent::_cargarFormEdicion($dataView, TRUE); 
		}
		else { parent::ver_todos($dataView); }
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
	// No se puede eliminar los clientes.
	  return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}
}